package com.ysh.dao;


import com.ysh.bean.Student;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

/*
    查询操作
 */
public class StudentTest01 {
    InputStream is = null;
    SqlSessionFactory sqlSessionFactory = null;
    SqlSession sqlSession = null;

    @Before
    public void before() throws Exception{
        // 1.读取核心配置文件
        is = Resources.getResourceAsStream("MyBatisConfig.xml");
        // 2.构建SqlSessionFactory工厂对象
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);// 构建者模式
        // 3.通过SqlSessionFactory工厂对象获取SqlSession对象，并设置自动提交
        sqlSession = sqlSessionFactory.openSession(true);

    }
    @After
    public void after() throws Exception{
        // 6.释放资源
        sqlSession.close();
        is.close();
    }

    /*
        删除功能
     */
    @Test
    public void delete() throws Exception{
        /*// 1.读取核心配置文件
        InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");

        // 2.构建SqlSessionFactory工厂对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);// 构建者模式

        // 3.通过SqlSessionFactory工厂对象获取SqlSession对象，并设置自动提交
        SqlSession sqlSession = sqlSessionFactory.openSession(true);*/

        // 4.执行sql语句
        int delete = sqlSession.delete("StudentMapper.delete", 2);

        // 5.处理结果
        System.out.println(delete);

        /*// 6.释放资源
        sqlSession.close();
        is.close();*/
    }

    /*
        修改功能
     */
    @Test
    public void update() throws Exception{
       /* // 1.加载核心配置文件
        InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");

        // 2.获取SqlSessionFactory工厂对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);

        // 3.通过SqlSessionFactory工厂对象获取SqlSession对象，并设置自动提交
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        */
        // 4.执行sql语句
        Student stu = new Student(2,"吕布",26);
        int update = sqlSession.update("StudentMapper.update", stu);

        // 5.处理结果
        System.out.println(update);

        /*// 6.释放资源
        sqlSession.close();
        is.close();*/
    }
    /*
        新增功能
     */
    @Test
    public void insert() throws Exception {
        /*// 1.加载核心配置文件
        InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");
        // 2.获取SqlSessionFactory工厂对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        // 3.通过SqlSessionFactory工厂对象获取SqlSession对象
        *//*
            openSession(Boolean boolean),无参默认false，表示手动提交事务，而为true表示自动提交事务，即后面不再需要commit方法了
         *//*
        SqlSession sqlSession = sqlSessionFactory.openSession();*/
        // 4.执行配置文件中的sql语句，并接收结果
        Student stu = new Student(3,"郑爽",29);
        int result = sqlSession.insert("StudentMapper.insert", stu);
        // 5.提交事务
        // sqlSession.commit();
        // 6.处理结果
        System.out.println(result);
        /*// 7.释放资源
        sqlSession.close();
        is.close();*/
    }

    /*
        根据id进行查询
     */
    @Test
    public void selectById() throws IOException{
        /*// 1.加载核心配置文件
        InputStream is = Resources.getResourceAsStream("MyBatisConfig.xml");
        // 2.获取SqlSessionFactory工厂对象
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
        // 3. 获取SqlSession对象
        SqlSession sqlSession = sqlSessionFactory.openSession();*/
        // 4.执行映射配置文件中的sql语句，并接收结果
        Student stu = sqlSession.selectOne("StudentMapper.selectById", 1);
        // 5.处理结果，直接打印
        System.out.println(stu);
        /*// 6.释放资源
        sqlSession.close();
        is.close();*/
    }

    /*
        查询全部
     */
    @Test
    public void selectAll() throws IOException {
        // 4.执行映射配置文件中的sql语句，并接收结果
        // mapper映射文件中的namespace名称空间下的select语句的id值，即：名称空间.id标识
        // Execute执行器封装在selectList方法中
        List<Student> list = sqlSession.selectList("StudentMapper.selectAll");

        // 5.处理结果
        for (Student student : list) {
            System.out.println(student);
        }

    }
}
